package com.samp.base.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PatternAndMatcher {

    /**
     * Pattern对象是java正则使用的第一步，字符串形式的正则表达式，先要转换成Pattern对象，再由pattern对象对需要匹配的字符串进行
     * 匹配，返回一个Matcher对象。
     * Pattern对象是线程安全的，所以新建一个Pattern对象后，可以多线程匹配，但Mather非线程安全。
     * Pattern常用的方法：
     * compile，用来创建Pattern对象
     * matches，简单的匹配调用，静态方法。
     * split，按正则表达式分隔字符串。
     *
     * 常用的正则表达式含义：
     *  *：代表0个或多个。
     *  +：代表1个或多个。
     *  ?：代表0个或1个。
     *  {n}：代表匹配n个。
     *  {n,m}：代表匹配n至m个。
     *  {n,}：代表至少匹配n个。
     *  [a-zA-Z] 代表所有大小写字母
     *  [^a-z].匹配任何不属于a-z中的字符
     *  \s  匹配空字符(空格,tab,/n,换页,回车)
     *  \S  匹配非空字符(和[^/s]一样)
     *  \d 匹配数字,相当于[0-9]
     *  \D 匹配非数字,相当于[^0-9],匹配中文,空格,换行符
     *  \w 匹配词字符,相当于[a-zA-Z0-9],不包含中文,不能代表空格,换行符
     *  \W 匹配非词字符,相当于[^/w]
     *  运算符有：
     *  |:管道符.如:x|y表示x或y
     *  边界匹配符:
     *  ^:从头匹配
     *  $:从尾匹配
     */
    public static void patternDemo(){
        //正常的使用模式，分三步，定义regex，编译Pattern对象，再matcher()方法返回Matcher对象。
        String regex = "[0-9]+";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher("2323211212");
        System.out.println(matcher.matches());
        //如果Pattern对象只使用一次，也有简单的静态调用方式
        System.out.println(Pattern.matches(regex,"2323211212"));
        //pattern的split方法，根据正则表达式切分字符串。
        String[] splits = pattern.split("ab43cd2deadf"); //将字符串以数字区分。
        for (String str : splits) {
            System.out.println(str);
        }
        System.out.println("匹配空字符"+Pattern.matches("\\s+","          "));
    }

    /**
     * Matcher对象封装的是一个string的匹配结果。有如下常用方法：
     * matches(): 完全匹配，最常用的方法，完全匹配时返回true。
     * find(): 部分匹配，匹配一次后，会从匹配后的字符串重新再匹配。
     * lookingAt(): 永远从第一个字符开始匹配，如果匹配到了就返回true，否则false.
     */
    public static void matcherDemo(){
        String regex = "-\\d";
        String text = "-9solr-6.6-1.jar";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(text);
        boolean isMatch = matcher.matches();
        System.out.println(isMatch);
        //System.out.println(matcher.groupCount());
        while( matcher.find() ){
            System.out.println("matcher.start()="+matcher.start());
            System.out.println("matcher.end()="+matcher.end());
        }
       // matcher.reset();
        for (int i = 0; i < 10; i++) {
            if( matcher.lookingAt() ) {
                System.out.println("matcher.start()=" + matcher.start());
                System.out.println("matcher.end()=" + matcher.end());
            }else{
                System.out.println("no lookingAt match");
            }
        }
    }
    public static void main(String[] args) {
        //patternDemo();
        matcherDemo();
    }
}
